package com.merlin.demo_wellshape.service;

import com.merlin.demo_wellshape.pojo.CheckInRecord;
import com.merlin.demo_wellshape.pojo.ResponseMessage;
import com.merlin.demo_wellshape.pojo.User;
import org.springframework.stereotype.Service;

import java.time.LocalDate;
import java.util.List;

@Service // 将UserService注入到spring容器中
public interface UserServiceImpl {
    /**
     * 创建用户
     *
     * @param user
     * @return
     */
    ResponseMessage saveUser(User user);

    /**
     * 判断用户手机号是否存在
     *
     * @param userPhone
     * @return
     */
    boolean isUserPhoneExists(String userPhone);

    /**
     * 根据id查询用户
     *
     * @param id
     * @return
     */
    User getUserByUserId(int id);

    /**
     * 根据手机号查询用户
     *
     * @param userPhone
     * @return
     */
    User getUserByPhone(String userPhone);

    /**
     * 更新用户
     *
     * @param userId
     * @param userDetails
     * @return
     */
    User updateUser(int userId, User userDetails);

    /**
     * 获取用户头像的base64编码
     *
     * @return
     */
    String getAvatarBase64(int userId);

    /**
     * 删除用户
     *
     * @param id
     * @return
     */
    boolean deleteUser(int id);

    /**
     * 签到
     *
     * @param checkInRecord
     */
    void saveCheckInRecord(CheckInRecord checkInRecord);

    /**
     * 获取签到记录
     *
     * @param user
     * @return
     */
    List<CheckInRecord> getCheckInRecordsByUserAndDateRange(User user, LocalDate startDate, LocalDate endDate);

    /**
     * 判断用户今天是否签到
     *
     * @param user
     * @param date
     * @return
     */
    boolean hasCheckedInToday(User user, LocalDate date);

    /**
     * 根据用户id和用户手机号获取签到记录
     *
     * @param userId
     * @param userPhone
     * @return
     */
    List<CheckInRecord> getCheckInRecordsByUserIdAndUserPhone(int userId, String userPhone);

    /**
     * 批量插入签到记录
     *
     * @param userPhone
     * @param dates
     */
    void insertCheckInRecords(String userPhone, LocalDate... dates);

    /**
     * 删除签到记录
     *
     * @param user
     * @param checkInDate
     * @return
     */
    boolean deleteCheckInRecord(User user, LocalDate checkInDate);
}
